package com.community.backend.websocket;

import com.alibaba.fastjson.JSON;
import com.community.backend.pojo.Fee;
import com.community.backend.utils.RedisUtils;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * WebSocket服务
 */


//发现不能注入redis
//@ServerEndpoint 类不是 Spring 管理的单例，而是 Tomcat 为每一次 WebSocket 握手 new 出来的
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();


    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        sessionMap.put(sid, session);
        RedisTemplate<String, Object> redis = RedisUtils.redis();
//这里的key 有问题我有三个对象
 // 解决：存的的时候key为offline+id
        //  key 里存 List<String>  JSON
        String key = "offline:" + sid;
        while (true) {
            String json = (String) redis.opsForList().leftPop(key);

//        List<String> list = (List<String>) JSON.toJSON( redis.opsForList().range(key, 0, -1)); // 全部取出
        System.out.println("json"+json);
            if (json == null) break;
            sendToOne(sid, json);   // 一条一条发
        }
    }
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(@PathParam("sid") String sid,String message) {


        System.out.println("收到来自客户端：" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 群发
     *
     * @param message
     */
    public void sendToAllClient(String message) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public static void sendToOne(String sid, String message) {
        Session session = sessionMap.get(sid);
        if (session == null) {
            System.out.println("sid=" + sid + " 不在线，消息丢弃");
            return;
        }
        System.out.println("发送给：" + sid + "信息：" + message);
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
